package br.com.werp.regras.acesso.integracao;

import br.com.werp.regras.geral.integracao.MasterDAO;
import br.com.werp.regras.geral.util.Constantes;
import br.com.werp.regras.geral.vos.acesso.UsuarioEmpresaSetorVO;
import br.com.werp.regras.geral.vos.suporte.EmpresaSetorVO;
import br.com.werp.regras.geral.vos.suporte.EmpresaVO;
import br.com.werp.regras.geral.vos.tabelas.Setor;
import br.com.werp.regras.geral.vos.tabelas.Usuario_empresa;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;


/**
 * @author Candido
 * Created on 19/10/2004
 *
 *
 */
public class UsuarioEmpresaSetorDAO extends MasterDAO {
    private static final String USUARIO_EMPRESA = "USUARIO_EMPRESA";
    private static final String OBTER_EMPRESA_USUARIO = "OBTER_EMPRESA_USUARIO";
    private static final String EMPR_ID = "EMPR_ID";
    private static final String STOR_ID = "STOR_ID";
    private static final String EMPR_DESCRICAO = "EMPR_DESCRICAO";
    private static final String OBTER_EMPRESA_SETOR = "OBTER_EMPRESA_SETOR";
    private static final String STOR_DESCRICAO = "STOR_DESCRICAO";
    private static final String REMOVER_EMPRESA_SETOR = "REMOVER_EMPRESA_SETOR";
    private static final String USEM_USUARIO = "USEM_USUARIO";
    private static UsuarioEmpresaSetorDAO usuarioEmpresaSetorDAO;

    /**
     * @param banco
     * @throws Exception
     */
    private UsuarioEmpresaSetorDAO(String banco) throws Exception {
        super(banco);
    }

    public static UsuarioEmpresaSetorDAO getUsuarioEmpresaSetorDAO()
        throws Exception {
        if (usuarioEmpresaSetorDAO == null) {
            ResourceBundle bundle = ResourceBundle.getBundle(Constantes.CONFIG);
            usuarioEmpresaSetorDAO = new UsuarioEmpresaSetorDAO(bundle.getString(
                        Constantes.BANCO));
        }

        return usuarioEmpresaSetorDAO;
    }

    public void inserirUsuarioEmpresa(Usuario_empresa usuario_empresa,
        Object object) throws Exception {
        Connection conn = (Connection) object;
        inserirVO(conn, usuario_empresa);
    }

    public List obterEmpresas(String usuarioLogin) throws Exception {
        Connection conn = null;
        ArrayList arrayList = new ArrayList();

        try {
            conn = getConexao();

            String query = getQuery(OBTER_EMPRESA_USUARIO);
            PreparedStatement statement = conn.prepareStatement(query);
            setString(1, statement, usuarioLogin);

            ResultSet resultSet = statement.executeQuery();

            while (resultSet.next()) {
                EmpresaVO empresaVO = new EmpresaVO();
                empresaVO.setEmpr_id(resultSet.getInt(EMPR_ID));
                empresaVO.setEmpr_descricao(resultSet.getString(EMPR_DESCRICAO));
                arrayList.add(empresaVO);
            }
        } catch (Exception e) {
            throw e;
        } finally {
            liberaConeccao(conn);
        }

        return arrayList;
    }

    public List obterEmpresaSetor(UsuarioEmpresaSetorVO usuarioEmpresaVO)
        throws Exception {
        Connection conn = null;

        try {
            conn = getConexao();

            String where = " and empr_id = usem_empresa and " +
                    "usem_setor = stor_id and stor_id = stem_setor and " +
                    " stem_empresa = empr_id ";
            String tabelas = " Usuario_empresa,Empresa,Setor,Setor_empresa ";

            return pesquisarVO(conn, usuarioEmpresaVO, where, tabelas,
                UsuarioEmpresaSetorVO.EXCLUIDAS);
        } finally {
            liberaConeccao(conn);
        }
    }

    public void removerEmpresaSetor(Object object, String usuario)
        throws Exception {
        Connection conn = null;

        try {
            conn = validarTransacao(object);

            String query = getQuery(REMOVER_EMPRESA_SETOR);
            PreparedStatement statement = conn.prepareStatement(query);
            setString(1, statement, usuario);
            statement.executeUpdate();
        } catch (Exception e) {
            throw e;
        }
    }

    /**
     * @param object
     * @param usuario_empresa2
     * @throws Exception
     */
    public void inserirUsuarioSetor(Object object,
        Usuario_empresa usuario_empresa) throws Exception {
        Connection conn = null;
        conn = validarTransacao(object);
        inserirVO(conn, usuario_empresa);
    }

    public void inserirSetor(Object object, Setor setor)
        throws Exception {
        Connection conn = null;
        conn = validarTransacao(object);
        inserirVO(conn, setor, new String[] { "stor_id" });
    }
}
